/**
 * @fileoverview Giant Interective Group, Inc. Javascript Library v2.0.3.
 * 年月日级联列表控件。
 * <pre>
 * Copyright (C) 2004-2009 Giant Interective Group, Inc. All rights reserved.
 * 版权所有 2004-2009 上海巨人网络科技有限公司
 * </pre>
 * 
 * @version 2.0.3, 2009-05-22 11:40:52
 * @author  Fuchun
 */

(function($) {

/** 星座列表。
 * @type Object */
giant.ui.astros = {
	Aries: "白羊座",
	Taurus: "金牛座",
	Gemini: "双子座",
	Cancer: "巨蟹座",
	Leo: "狮子座",
	Virgo: "处女座",
	Libra: "天秤座",
	Scorpio: "天蝎座",
	Sagittarius: "射手座",
	Capricornus: "摩羯座",
	Aquarius: "水瓶座",
	Pisces: "双鱼座"
};
giant.ui.astrosCss = {
	Aries: 'guide-astro g-aries',
    Taurus: 'guide-astro g-taurus',
    Gemini: 'guide-astro g-gemini',
    Cancer: 'guide-astro g-cancer',
    Leo: 'guide-astro g-leo',
    Virgo: 'guide-astro g-virgo',
    Libra: 'guide-astro g-libra',
    Scorpio: 'guide-astro g-scorpio',
    Sagittarius: 'guide-astro g-sagittarius',
    Capricornus: 'guide-astro g-capricorn',
    Aquarius: 'guide-astro g-aquarius',
    Pisces: 'guide-astro g-pisces'
};
/** 月份列表。
 * @type Array */
giant.ui.months = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];

/** 每月至少的天数。
 * @type Array */
giant.ui.dayOfMonth = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10',
'11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
'21', '22', '23', '24', '25', '26', '27', '28'];

/**
 * 获取指定年份和月份的天数。
 * 
 * @param {Number} y 指定的年份。
 * @param {Number} m 指定的月份（索引从0开始）。
 * @returns {Number} 返回指定年份和月份的天数。
 */
giant.ui.getDayOfMonth = function(y, m) {
	var isLeap = false, dates = giant.extend([], giant.ui.dayOfMonth);
	if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
		isLeap = true;
	}
	m = parseInt(m);
    if(m === 1 || m === 3 || m === 5 || m === 7 || m === 8 ||
            m === 10 || m === 12) {
        dates.push('29');
        dates.push('30');
        dates.push('31');
    } else if(m === 4 || m === 6 || m === 9 || m === 11) {
        dates.push('29');
        dates.push('30');
    } else if(m === 2) {
        if(isLeap)
            dates.push('29');
    }
	return dates;
};

/**
 * 获取指定月份和日期的所属星座。
 * 
 * @param {Number} m 指定的月份。
 * @param {Number} d 指定的日期。
 * @returns {String} 指定月份和日期的所属星座。
 */
giant.ui.getAstro = function(m, d) {
	if(parseInt(d) < 10)
        d = '0' + d;
	var b = Number(m + '' + d);
	if(b >= 321 && b <= 419) {
		return 'Aries';
	} else if(b >= 420 && b <= 520) {
		return 'Taurus';
	} else if(b >= 521 && b <= 621) {
		return 'Gemini';
	} else if(b >= 622 && b <= 722) {
		return 'Cancer';
	} else if(b >= 723 && b <= 822) {
		return 'Leo';
	} else if(b >= 823 && b <= 922) {
		return 'Virgo';
	} else if(b >= 923 && b <= 1023) {
		return 'Libra';
	} else if(b >= 1024 && b <= 1122) {
		return 'Scorpio';
	} else if(b >= 1123 && b <= 1221) {
		return 'Sagittarius';
	} else if((b >= 1222 && b <= 1231) ||(b >= 101 && b <= 119)) {
		return 'Capricornus';
	} else if(b >= 120 && b <= 218) {
		return 'Aquarius';
	} else if(b >= 219 && b <= 320) {
		return 'Pisces';
	}
	return '';
};

var dateSettings = {
	year: 'cmb_year',
	month: 'cmb_month',
	date: 'cmb_date',
	range: [1960, 1994]
};

var dateDefaults = {
	year: 1980, month: 1, date: 1
}

/**
 * 创建一个新的 giant.ui.Date 日期控件。
 * @class giant.ui.Date 日期控件。
 * @example
 * <pre>
 * $.date({year:'cmb_year', month:'cmb_month', date:'cmb_date'},
 * {year:1983, month:2, date:14});
 * </pre>
 * 
 * @constructor
 * @param {Object} options 日期控件的配置参数。<br>
 *         options.year  --&gt;  年份的下拉框Id。<br>
 *         options.month --&gt;  月份的下拉框Id。<br>
 *         options.date  --&gt;  日期的下拉框Id。<strong>（可选）</strong><br>
 *         options.yearChange  --&gt; 年份控件变更后，执行的回调函数。<strong>（可选）</strong><br>
 *         &nbsp;&nbsp;yearChange() { this; // 表示为日期控件 giant.ui.Date 的实例 }<br>
 *         options.monthChange --&gt; 月份控件变更后，执行的回调函数。<strong>（可选）</strong><br>
 *         &nbsp;&nbsp;monthChange() { this; // 表示为日期控件 giant.ui.Date 的实例 }<br>
 *         options.dateChange  --&gt; 日期控件变更后，执行的回调函数。<strong>（可选）</strong><br>
 *         &nbsp;&nbsp;dateChange() { this; // 表示为日期控件 giant.ui.Date 的实例 }<br>
 * @param {Object} defaults 日期控件的默认值配置参数。<br>
 *         defaults.year  --&gt;  年份的初始值。<br>
 *         defaults.month --&gt;  月份的初始值。<br>
 *         defaults.date  --&gt;  日期的初始值。
 * @returns {giant.ui.Date} 新的giant.ui.Date实例。
 */
giant.ui.Date = function(options, defaults) {
	var s = giant.extend(dateSettings, options),
	    d = giant.extend(dateDefaults, defaults);
	var jyearId = s.year.startsWith('#') ? s.year : '#' + s.year,
        jmonthId = s.month.startsWith('#') ? s.month : '#' + s.month,
        jdateId = s.date.startsWith('#') ? s.date : '#' + s.date;
	this.jYear = $.combobox({id:jyearId});
	this.jMonth = $.combobox({id:jmonthId});
	this.dateExist = true;
	if($(jdateId).length === 0)
	    this.dateExist = false;
	if(this.dateExist) {
	   this.jDate = $.combobox({id:jdateId});
	   this.astro = giant.ui.getAstro(d.month, d.date);
	}
	this.range = s.range;
	this.yearChange = giant.isFunction(s.yearChange) ? s.yearChange :
	        giant.EmptyFn;
	this.monthChange = giant.isFunction(s.monthChange) ? s.monthChange :
	        giant.EmptyFn;
	this.dateChange = giant.isFunction(s.dateChange) ? s.dateChange :
	        giant.EmptyFn;
	this.initComponent(s, d);
};

/**#@+
 * @memberOf giant.ui.Date
 * @method
 */
giant.ui.Date.prototype = {
	
	// 初始化日期控件
	initComponent: function(options, defaults) {
		var optYears = [], optMonths = [], optDates = [], i, $self = this;
		if(this.jYear.length() < 10) {
		    this.jYear.remove();
			for(i = this.range[1], len = this.range[0]; --i >= len;) {
				optYears.push(i.toString());
			}
			this.jYear.addItem(optYears);
		}
		if(this.jMonth.length() <= 1) {
	    	for(i = 0, len = giant.ui.months.length; i < len; i++) {
	            optMonths.push({text: giant.ui.months[i], value: (i+1)});
	        }
	        this.jMonth.addItem(optMonths);
	    }
		if(this.dateExist && this.jDate.length() <= 1) {
			for(i = 0, len = giant.ui.dayOfMonth.length; i < len; i++) {
	            optDates.push({text: giant.ui.dayOfMonth[i], value: (i + 1)});
	        }
	        this.jDate.addItem(optDates);
		}
		if(this.dateExist) {
			// 动态更改对应的日期
			function changeDate() {
	            var y = $self.jYear.value(), m = $self.jMonth.value();
	            var days = giant.ui.getDayOfMonth(y, m), opts = [];
	            if($self.jDate.length() !== days.length) {
	            	var oldDate = $self.jDate.value();
		            $self.jDate.remove();
		            for(var i = 0, len = days.length; i < len; i++) {
		            	opts.push({text:days[i], value:(i + 1)});
		            }
		            $self.jDate.addItem(opts);
		            if(oldDate !== 1) {
			            setTimeout(function() {
			            	$self.jDate.select({value: oldDate});
			            	changeAstro();
			            	$self.dateChange.call($self);
			            }, 20);
		            }
	            }
			}
			// 动态更改对应的星座
			function changeAstro() {
				var m = $self.jMonth.value(), d = $self.jDate.value();
				$self.astro = giant.ui.getAstro(m, d);
			}
			this.jYear.addEvent("change", function() {
				changeDate();
				$self.yearChange.call($self);
			});
			this.jMonth.addEvent("change", function() {
				changeDate();
				changeAstro();
				$self.monthChange.call($self);
			});
			this.jDate.addEvent("change", function() {
				changeAstro();
				$self.dateChange.call($self);
			});
			this.initValue(defaults, changeDate);
		}
	},
	
	// 初始化日期控件的初始值。
	initValue: function(defaults, change) {
		var $self = this;
		this.jYear.select({value: defaults.year}, change);
		this.jMonth.select({value: defaults.month}, change);
	    setTimeout(function() {
			$self.jDate.select({value: defaults.date}, function() {
				$self.dateChange.call($self);
			});
		}, 60);
	},
	
	/**
	 * 获取当前日期控件的当前日期对应的星座。
	 * 
	 * @returns {String} 日期对应的星座。
	 */
	getAstro: function() { return this.astro; },
	
	/**
     * 获取当前日期控件的年份。
     * 
     * @returns {Number} 当前日期控件的年份。
     */
	getYear: function() { return this.jYear.val(); },
	
	/**
     * 获取当前日期控件的月份。
     * 
     * @returns {Number} 当前日期控件的月份。
     */
	getMonth: function() { return this.jMonth.val(); },
	
	/**
     * 获取当前日期控件的日期(一个月中的第几天)。
     * 
     * @returns {Number} 当前日期控件的日期(一个月中的第几天)。
     */
	getDate: function() { return this.dateExist ? this.jDate.val() : ''; }
};
/**#@-*/

$.date = function(options, defaults) {
	return new giant.ui.Date(options, defaults);
};

})(jQuery);